// StartsWith 判断字符串是否以某个前缀开头

// 用 Str 去匹配一个模式类型，模式类型的前缀是 Prefix，后面是任意的 string，如果匹配返回 true，否则返回 false。

type StartsWith<Str extends string, Prefix extends string> = Str extends `${Prefix}${string}`
  ? true
  : false;

type res = StartsWith<'abc', '2'>;

// --------------------------------------------------

// Replace 实现字符串替换

type ReplaceStr<
  Str extends string,
  From extends string,
  To extends string,
> = Str extends `${infer Prefix}${From}${infer Suffix}` ? `${Prefix}${To}${Suffix}` : Str;

type res2 = ReplaceStr<'abc123dfg', '123', '000'>;

// --------------------------------------------------

// Trim 去除空白字符

// 不过因为我们不知道有多少个空白字符，所以只能一个个匹配和去掉，需要递归。

type _TrimStrRight<Str extends string> = Str extends `${infer Rest}${' ' | '\n' | '\t'}`
  ? Rest
  : Str;

type res3 = _TrimStrRight<'abc  '>;

// 把 Rest 作为类型参数递归 TrimRight，直到不匹配，这时的类型参数 Str 就是处理结果。

type TrimStrRight<Str extends string> = Str extends `${infer Rest}${' ' | '\n' | '\t'}`
  ? TrimStrRight<Rest>
  : Str;

type res4 = TrimStrRight<'abc  '>;

// 同理 匹配左侧

type TrimStrLeft<Str extends string> = Str extends `${' ' | '\n' | '\t'}${infer Rest}`
  ? TrimStrLeft<Rest>
  : Str;

type res5 = TrimStrLeft<'  abc'>;

// TrimRight 和 TrimLeft 结合就是 Trim：

type TrimStr<Str extends string> = TrimStrLeft<TrimStrRight<Str>>;

type res6 = TrimStr<'  abc  1  '>;

export {};
